import pandas as pd
import numpy as np
import plotly.express as px
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import plotly
plotly.offline.init_notebook_mode()
df = pd.read_csv(
'MICRODADOS_ENEM_2019.csv',
header=0,
encoding = "ISO-8859-1",
sep=';',
skiprows=lambda i: i>0 and np.random.rand() > 0.005,
)
df.head()
answers = ['TX_RESPOSTAS_CN', 'TX_RESPOSTAS_CH', 'TX_RESPOSTAS_LC', 'TX_RESPOSTAS_MT']
correct_answers = ['TX_GABARITO_CN', 'TX_GABARITO_CH', 'TX_GABARITO_LC', 'TX_GABARITO_MT']
scores = ['NU_NOTA_CN', 'NU_NOTA_CH', 'NU_NOTA_LC', 'NU_NOTA_MT','NU_NOTA_REDACAO']
foreign_language = ['TP_LINGUA']
questions = ['TP_SEXO', 'TP_COR_RACA', 'Q001', 'Q002', 'TP_DEPENDENCIA_ADM_ESC']
df = df[['NU_INSCRICAO']+foreign_language+answers+correct_answers+scores+questions]
df.shape
df['TP_SEXO'].replace({'M': 'Masculino',
'F': 'Feminino'}, inplace=True)
df['TP_COR_RACA'].replace({0:'Não declarada',
1:'Branca',
2:'Preta',
3:'Parda',
4:'Amarela',
5:'Indígena'}, inplace=True)
df['Q001'].replace({'A': 'Nunca estudou',
'B': 'Fund. incompleto',
'C': 'Fund. incompleto',
'D': 'Medio incompleto',
'E': 'Medio completo',
'F': 'Superior completo',
'G': 'Pós graduação',
'H': 'Não sabe'}, inplace=True)
df['Q002'].replace({'A': 'Nunca estudou',
'B': 'Fund. incompleto',
'C': 'Fund. incompleto',
'D': 'Medio incompleto',
'E': 'Medio completo',
'F': 'Superior completo',
'G': 'Pós graduação',
'H': 'Não sabe'}, inplace=True)
df['TP_DEPENDENCIA_ADM_ESC'].replace({1: 'Federal',
2: 'Estadual',
3: 'Municipal',
4: 'Privada'}, inplace=True)
df['NU_MEDIA_NOTA'] = df[['NU_NOTA_CN', 'NU_NOTA_CH', 'NU_NOTA_LC', 'NU_NOTA_MT', 'NU_NOTA_REDACAO']].sum(axis=1)/5
df = df[(df['NU_NOTA_LC'] != 0) &
(df['NU_NOTA_CH'] != 0) &
(df['NU_NOTA_CN'] != 0) &
(df['NU_NOTA_MT'] != 0)]
df['TX_RESPOSTAS_LC'] = df['TX_RESPOSTAS_LC'].str.replace('9', '')
df.loc[df.TP_LINGUA == 0, 'TX_GABARITO_LC'] = df.query('TP_LINGUA ==0')['TX_GABARITO_LC'].str.slice(stop=5)+df['TX_GABARITO_LC'].str.slice(start=10)
df.loc[df.TP_LINGUA == 1, 'TX_GABARITO_LC'] = df['TX_GABARITO_LC'].str.slice(start=5)
df = df.dropna(subset=['TX_RESPOSTAS_CN', 'TX_RESPOSTAS_CH', 'TX_RESPOSTAS_LC', 'TX_RESPOSTAS_MT'])
df['ACERTOS_CN'] = df.apply(lambda x: np.sum(np.array(list(x['TX_RESPOSTAS_CN'])) == np.array(list(x['TX_GABARITO_CN']))), axis=1)
df['ACERTOS_CH'] = df.apply(lambda x: np.sum(np.array(list(x['TX_RESPOSTAS_CH'])) == np.array(list(x['TX_GABARITO_CH']))), axis=1)
df['ACERTOS_LC'] = df.apply(lambda x: np.sum(np.array(list(x['TX_RESPOSTAS_LC'])) == np.array(list(x['TX_GABARITO_LC']))), axis=1)
df['ACERTOS_MT'] = df.apply(lambda x: np.sum(np.array(list(x['TX_RESPOSTAS_MT'])) == np.array(list(x['TX_GABARITO_MT']))), axis=1)
df.dtypes
df.drop(columns=['TP_LINGUA']).describe()
fig = px.histogram(df['NU_NOTA_LC'], color_discrete_sequence=['#f5d86e'])
fig.update_layout(title='Distribuição das notas de Linguagens e Códigos')
fig = px.histogram(df['NU_NOTA_CH'],color_discrete_sequence=['#b46ef5'])
fig.update_layout(title='Distribuição das notas de Ciencias Humanas')
fig = px.histogram(df['NU_NOTA_MT'], color_discrete_sequence=['#6e92f5'])
fig.update_layout(title='Distribuição das notas de Matemática')
fig = px.histogram(df['NU_NOTA_CN'], color_discrete_sequence=['#6ef587'])
fig.update_layout(title='Distribuição das notas de Ciencias da Natureza')
fig = px.histogram(df['NU_NOTA_REDACAO'], color_discrete_sequence=['#f56e6e'])
fig.update_layout(title='Distribuição das notas de Redação')
import statsmodels.api as sm
fig, axes = plt.subplots(3, 2, figsize=(20, 15))
fig = sm.qqplot(df['NU_NOTA_LC'], ax=axes[0,0])
fig = sm.qqplot(df['NU_NOTA_CH'], ax=axes[0,1])
fig = sm.qqplot(df['NU_NOTA_CN'], ax=axes[1,0])
fig = sm.qqplot(df['NU_NOTA_MT'], ax=axes[1,1])
fig = sm.qqplot(df['NU_NOTA_REDACAO'], ax=axes[2,0])
fig.suptitle('Graficos Q-Q para distribuição de notas em cada área de conhecimento', fontsize=16, y = 0.94)
axes[0, 0].set_title('Linguagens')
axes[0, 1].set_title('Ciências Humanas')
axes[0, 1].set_title('Ciências da Natureza')
axes[1, 1].set_title('Matemática')
axes[2, 0].set_title('Redação')
plt.show()
fig, axes = plt.subplots(2, 2, figsize=(20, 15))
sns.scatterplot(x=df['ACERTOS_LC'], y=df['NU_NOTA_LC'], ax=axes[0,0], color='r')
sns.scatterplot(x=df['ACERTOS_CH'], y=df['NU_NOTA_CH'], ax=axes[0,1], color='rebeccapurple')
sns.scatterplot(x=df['ACERTOS_CN'], y=df['NU_NOTA_CN'], ax=axes[1,0], color='g')
sns.scatterplot(x=df['ACERTOS_MT'], y=df['NU_NOTA_MT'], ax=axes[1,1])
fig.suptitle('Intervalo de pontuação de acordo com a quantidade de acertos', fontsize=16, y = 0.94)
axes[0, 0].set_title('Linguagens')
axes[0, 1].set_title('Ciências Humanas')
axes[0, 1].set_title('Ciências da Natureza')
axes[1, 1].set_title('Matemática')
plt.show()
px.histogram(df, x="TP_DEPENDENCIA_ADM_ESC", title='Quantidade de escolas por tipo de administração')
px.pie(df,"TP_COR_RACA", title='Quantidade de inscritos por raça', hole = 0.7)
px.box(
df.loc[(~df.TP_DEPENDENCIA_ADM_ESC.isna())],
x= 'NU_MEDIA_NOTA', color='TP_DEPENDENCIA_ADM_ESC', title='Box plot das notas médias por escola',
category_orders={'TP_DEPENDENCIA_ADM_ESC': ['Estadual', 'Municipal', 'Federal', 'Privada']})
px.box(
df.loc[(~df.Q001.isna())],
x= 'NU_MEDIA_NOTA', color='Q001', title='Box plot das notas médias por nivel de escolaridade do pai',
category_orders={'Q001': df.loc[(~df.Q001.isna())].groupby("Q001")['NU_MEDIA_NOTA'].mean().sort_values().keys()}
)
px.box(
df.loc[(~df.Q002.isna())],
x= 'NU_MEDIA_NOTA', color='Q001', title='Box plot das notas médias por nivel de escolaridade da mãe',
category_orders={'Q001': df.loc[(~df.Q002.isna())].groupby("Q002")['NU_MEDIA_NOTA'].mean().sort_values().keys()}
)
fig = px.scatter_matrix(df[scores])
fig.update_layout(height=800, width=1000)
fig = px.scatter(df.loc[df.TP_DEPENDENCIA_ADM_ESC.isin(["Estadual", "Privada"])], x="ACERTOS_MT", y="NU_NOTA_MT", color="TP_DEPENDENCIA_ADM_ESC", trendline="ols")
fig.update_layout(title="Reta de regressão ACERTOS_MT ~ NU_NOTA_MT por tipo de admnistração escolar")
results = px.get_trendline_results(fig)
results.query("TP_DEPENDENCIA_ADM_ESC == 'Estadual'").px_fit_results.iloc[0].summary()
results = px.get_trendline_results(fig)
results.query("TP_DEPENDENCIA_ADM_ESC == 'Privada'").px_fit_results.iloc[0].summary()
df_corr = df[scores].corr(
method = 'pearson'
)
sns.heatmap(df_corr, annot=True)
plt.title("Matriz de correlação entre as notas das áreas de conhecimento")
plt.show()
crosstab=pd.crosstab(index=df['Q001'],columns=df['Q002'], normalize='columns', margins=True)
crosstab